home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
embedded
/
m68k
/
tutor.arc
/
H.SA
< prev
next >
Wrap
Text File
|
1990-01-05
|
9KB
|
273 lines
H IDNT 1,1 Register save,Trace, Breakpoint 03/03/82
XDEF CHKBP
XDEF SAVE
XDEF SWAPOUT
XDEF TRACE
XDEF UNSTACK
XDEF UNTRACE
SPC 2
XREF ABORT335
XREF.S AV4
XREF.S AV9
XREF.S BPADD
XREF.S BPCNT
XREF.S BPDATA
XREF.S BPSTATUS
XREF FIXDCRLF
XREF FIXDATA
XREF FIRST
XREF GOCMD1
XREF LAST
XREF MACSBUG
XREF OUT1CR
XREF.S REGA7
XREF.S REGPC
XREF.S REGS
XREF.S REGSR
XREF.S REGUS
XREF.S SAVEAV4
XREF.S SYSTACK
XREF TDISPLY
XREF.S TRACECNT
XREF.S TRACEON
XREF.S TEMP
XREF V2
BKPOINT EQU $4AFB
EOT EQU 4
BELL EQU 7
SPC 1
ADDR2MEM MACRO
PEA.L \1(PC) MOVE ADDRESS TO MEMORY
MOVE.L (A7)+,\2
ENDM
SPC 1
SAVEREGS MACRO
MOVE.L A7,REGA7 SAVE STACK POINTER
LEA SV\@(PC),A7 A7 = RETURN ADDRESS (FOR CALL TO SAVE)
MOVE.L A7,TEMP TEMP = RETURN ADDRESS
BRA SAVE BSR WITHOUT USING STACK
SV\@ DS 0
SPC 1
ENDM
SPC 1
PAGE
SECTION 10
ADDR2MEM CHKBP,AV4 ILLEGAL INSTRUCTION
SECTION 11
*
* SAVE ALL REGISTERS ROUTINE-JMP [TEMP] BACK
* USUALLY CALLED BYE THE MACRO "SAVEREGS"
SAVE DS 0
LEA REGA7,A7 WHERE TO START STORING
MOVEM.L D0-D7/A0-A6,-(A7) SAVE REGISTERS
SPC 1
LEA SYSTACK+4,A7 SET UP STRETCHED VERSAUG STACK
SPC 1
MOVE.L REGA7,A0 A0 = TARGETS SUPERVISOR STACK POINTER
MOVE.W (A0)+,REGSR+2 GET TARGETS SR
SPC 1
MOVE.L (A0)+,REGPC GET TARGETS PC
SPC 1
MOVE.L A0,REGA7 WHERE TARGET STACK REALLY POINTS
SPC 1
MOVE.L USP,A1 GET USERS STACK POINTER
MOVE.L A1,REGUS SAVE IT FOR DISPLAY ETC
SPC 1
MOVE.L REGPC,D0 GET PROGRAM COUNTER
SUB.L #4,A7 SET REAL MACSBUG STACK
MOVE.L TEMP,-(A7) PUT RETURN ADDRESS ON STACK
RTS . RETURN TO SENDER
PAGE
*
* ***TRACE*** TRACE ENTRY POINT
* ENTER FROM VECTOR 9 (LOCATION 24) FOR
*
SPC 1
* REGISTER USAGE
* A0 = ADDRESS OF BREAKPOINT ADDRESS
* A2 = ADDRESS OF BREAKPOINT COUNTS
* D1 = PC
* D5 = TRACECNT
* D7 = BKPT COUNT
TRACE MOVE.W #$2700,SR MASK OFF INTERRUPTS
SAVEREGS
* IF PC POINTS TO 'TRACE'; DOUBLE EVENT OCCURED
* CLEAR LAST EVENT BY IGNORING
*
CMP.L #V2,REGPC
BNE.S TRACE16
SPC 1
MOVE.L REGA7,A5 TRIM LAST EVENT FROM STACK
MOVE.W (A5)+,REGSR+2 *MOVE VALUES FROM STACK TO
MOVE.L (A5)+,REGPC *PSUEDO SR, PC,
MOVE.L A5,REGA7 *REFLECT ADJUSTMENTS IN PSUEDO STACK
TRACE16 AND.W #$7FFF,REGSR+2 RESET "T" (TRACE) BIT
SPC 2
MOVE.L TRACECNT,D5
BMI.S TRACE39 EXECUTING ONE-INSTRUCTION
BEQ ABORT335 NOT TRACEING
SPC 1
* MAKE SURE WE ARE NOT TRACING OURSELVES
MOVE.L REGPC,D1 GET PC
LEA.L FIRST(PC),A0
CMP.L A0,D1
BMI.S TISOK TRACING BELOW OURSELVES
LEA LAST(PC),A0
CMP.L A0,D1
BHI.S TISOK TRACING ABOVE OURSELVES
LEA MSG020(PC),A5 TRACING OURSELVES
BRA CHKBP4 1,1
TISOK
SPC 1
LEA BPADD,A0
LEA BPCNT,A2
MOVE.L #9,D7 9TH BP IS "UNTILL" FEATURE
SPC 1
TRACE01 CMP.L (A0),D1 SEE IF PC MATCHES ADDRESS IN TABLE
BNE.S TRACE08
MOVE.L (A2),D0 GET COUNT
BEQ CHKBP3 COUNT ZERO
SUB.L #1,D0 COUNT DOWN
MOVE.L D0,(A2) SAVE IT
BEQ CHKBP3 COUNT WENT TO ZERO
BRA.S TRACE03
SPC 1
TRACE08 ADD.L #4,A0 BUMP TABLE POINTER
ADD.L #4,A2 BUMP COUNT TABLE POINTER
SUB.L #1,D7 LOOP AROUND
BNE TRACE01
SPC 1
TRACE03 BSR TDISPLY DO TRACE DISPLAY
SUB.L #1,TRACECNT TRACE COUNT
BEQ MACSBUG STOP WHEN ZERO
BRA.S UNTRACE CONTINUE WITH TRACE
SPC 3
* END UP HERE AFTER BREAKPOINTING ONE
* INSTRUCTION-PUT BP BACK IN AND CONTINUE TO RUN
TRACE39 CLR.L TRACECNT
BSR.S SWAPIN PUT BP INTO USER'S MEMORY
BRA.S UNSTACK CONTINUE TO RUN
PAGE
UNTRACE OR.W #$8000,REGSR+2 SET UP TRACE BIT!
ADDR2MEM TRACE,AV9 TAKE TRACE VECTOR
SPC 1
UNSTACK MOVE.L REGUS,A1
MOVE.L A1,USP US = TARGET'S USER STACK
MOVE.L REGPC,A2 A2 = TARGET'S PC
SPC 1
DS 0 INSURE MEMORY AT LOCATION OF PC
MOVE.W (A2),D0 * ADDR TRAP ERROR * IF NO MEMORY
SPC 1
MOVE.L REGA7,A1 A1 = TARGET SYSTEM STACK (SS)
SPC 1
DS 0 INSURE MEMORY AT TARGET'S STACK
MOVE.L A2,-(A1) MOVE PC ONTO TARGET'S STACK
SPC 1
MOVE.W REGSR+2,D0
MOVE.W D0,-(A1) SR ONTO TARGET'S STACK
SPC 1
MOVE.L A1,TEMP TEMP = TARGETS SS
SPC 1
LEA REGS,A7 A7 = POINTER TO PSUEDO REGISTERS
MOVEM.L (A7)+,D0-D7/A0-A6 ARM MOST OF TARGET REGISTERS
MOVE.L TEMP,A7 SS = TARGET'S
SPC 1
RTE . GO BACK TO THE USER
PAGE
SWAPIN BSR.S SWAPOUT MAKE SURE THEY ARE ALL OUT
SPC 1
MOVE.L AV4,SAVEAV4 SAVE VECTOR (WHOM EVER'S IT WAS)
LEA CHKBP(PC),A6
MOVE.L A6,AV4 REPLACE IT WITH THE "CHKBP" RTN
LEA SWAPIN1(PC),A6 A6 = ROUTINE ADDRESS
BRA.S SWAP
SPC 1
SWAPOUT TST.W BPSTATUS SEE IF OUT ALREADY
BEQ.S SWAPEND YES...DONE
MOVE.L SAVEAV4,AV4 NO....REPLACE THE VECTOR
SPC 1
LEA SWAPOUT1(PC),A6 A6 = ROUTINE ADDRESS
SWAP LEA BPADD,A0 A0 = ADDRESS OF TABLE
LEA BPCNT,A2 A2 = ADDRESS OF COUNTS
MOVE.L #9,D7 DO 9 BP
LEA BPDATA,A3 CONTENT TABLE
SPC 1
SWAP1 MOVE.L (A0),A4 GET POSSIBLE ADDDRESS
TST.L (A0) IS POSSIBLE ADDRESS ZERO
BEQ.S SWAP99 ZERO MEANS NO BP DEFINED
JMP (A6) GO TO RIGHT ROUTINE
SPC 1
SWAPIN1
MOVE.W (A4),D0 USER'S PROGRAM GOES INTO TABLE
SPC 1
MOVE.W D0,(A3)
MOVE.W #BKPOINT,(A4) PUT BREAKPOINT IN
SPC 1
MOVE.W #1,BPSTATUS FLAG AS BP IN
BRA.S SWAP99
SPC 1
SWAPOUT1 MOVE.W (A3),D0 GET CONTENTS FROM TABLE
MOVE.W D0,(A4) PUT CONTENTS BACK INTO PROGRAM
SPC 1
CLR.W BPSTATUS FLAG AS BREAKPOINTS OUT
SWAP99 ADD.L #4,A0 BUMP ADDRESS TABLE POINTER
ADD.L #2,A3 BUMP CONTENT TABLE POINTER
SUB.L #1,D7
BNE SWAP1
SWAPEND RTS
PAGE
* ILLEGAL INSTRUCTION ENTRY POINT
* BREAKPOINT TEST
*
CHKBP MOVE.W #$2700,SR MASK OF INT.
SAVEREGS
MOVE.L REGPC,D0 GET PROGRAM COUNTER TO COMPARE
MOVE.L D0,A5 A5 = TARGET PC
MOVE.W (A5),D1 SEE WHAT OP CODE WAS XEQ
SPC 1
BSR SWAPOUT TAKE BREAKPOINTS OUT
SPC 1
CMP.W #BKPOINT,D1 USED FOR BP
BNE.S CHKBP11 NOT AT BREAKPOINT
SPC 1
LEA BPADD,A0 A0 = ADDRESS OF BP ADDRESSES
LEA BPCNT,A2 A2 = ADDRESS OF BP COUNTS
MOVE.L #9,D7 D7 = LOOP COUNT
SPC 1
CHKBP1 CMP.L (A0),A5 SEE IF WE ARE THERE
BEQ.S CHKBP2 AT BREAKPOINT; AT AN ADDRESS
SPC 1
ADD.L #4,A0 BUMP BOTH POINTERS
ADD.L #4,A2
SUB.L #1,D7
BNE CHKBP1
SPC 1
* IS NOT A BREAKPOINT; ASSUME ILLEGAL INSTRUCTION
CHKBP11 LEA MSG009(PC),A5 'ILLEGAL INSTRUCTION'
CLR.W TRACEON RESET TRACE MODE 1,1
BRA.S CHKBP4
SPC 1
* AT BREAKPOINT...CHECK COUNT
CHKBP2 MOVE.L (A2),D0 GET COUNT
BEQ.S CHKBP3 COUNT ZERO
SUB.L #1,D0 DECREMENT
MOVE.L D0,(A2) PUT COUNT BACK
BNE GOCMD1 COUNT NOT ZERO; KEEP GOING
SPC 1
CHKBP3 LEA MSG014(PC),A5 "AT BREAKPOINT"
SPC 1
CHKBP4 BSR FIXDCRLF
BSR OUT1CR
BSR TDISPLY PRINT TRACE DISPLAY
BRA MACSBUG
SPC 1
MSG009 DC.B 'ILLEGAL INSTRUCTION',EOT
SPC 1
MSG014 DC.B 'AT BREAKPOINT',EOT
SPC 1
MSG020 DC.B '.PC within "DEBUGGER"',BELL,EOT
END